/*
 * socket.h
 *
 *  Created on: 17.01.2012
 *      Author: knz
 */

#ifndef SOCKET_H_
#define SOCKET_H_

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include "app-shared.h"

/**
  * Класс сокета, можно использовать для создания пассивного и активного сокета.
  *
  * Пассивный сокет (серверный сокет):
  * ==================================
  * ZSocket *socket = new ZSocket;
  * socket->doBind(dot_addr_string, port);
  * socket->doListen();
  * socket->doAccept();
  *
  * Активный сокет (клиентский сокет):
  * ==================================
  * ZSocket *socket = new ZSocket;
  * socket->doConnect(dot_addr_string, port);
  */

class Socket {
public:
    Socket(bool nonblocked);
    virtual ~Socket();

    bool doBind(const char *pchDotAddress, int iPort);
    bool doListen();
    bool doAccept(int &iClientDescriptor, std::string &sIpAddress);
    bool doConnect(const char *pchDotAddress, int iPort);
    void doClose();

    bool isBlocked() { return m_bNonblocked; }
    int descriptor() { return m_iDescriptor; }

    // Функция сравнения возвращает:
    // 0  - объекты совпадают
    // -1 - ошибка записи адреса
    // -2 - объект не найден
    int compare(const char *dot_addr_string, int port);


    AppResultCode lastError() { return m_arcLastError; }

    const char* ip() { return m_zIpAddress.data(); }
private:
    AsciiZ m_zIpAddress;
    int m_iDescriptor;
    struct sockaddr_in m_sockaddrServer;
    struct sockaddr_in m_sockaddrClient;
    int m_iSockaddrClientSize;
    // true - сокет работает в неблокирующем режиме
    bool m_bNonblocked;
    // true - сокет успешно распределен
    bool m_bIsValid;

    AppResultCode m_arcLastError;
};

#endif /* SOCKET_H_ */
